"""
演示继承，访问父类方法，访问类的公共字段属性
"""

class People:
    # 定义基本属性
    # age = 0
    # name = ""
    # 私有的属性，只能在本类访问
    __idcard = ""

    def __init__(self, name, age, idcard) -> None:
        self.name = name
        self.age = age
        self.__idcard = idcard
        super().__init__()

    def print_stu_info(self):
        print(f'父类方法(print_stu_info)：name = {self.name} age={self.age}')

    #私有方法
    def __print_stu_idcard(self):
        print(f'父类方法(print_stu_idcard)：idcard = {self.__idcard} ')

    #公共方法
    def print_stu_name(self):
        print(f'父类方法(print_stu_name)：name = {self.name} ')
        self.__print_stu_idcard()
        People.__print_stu_idcard(self)


class Student(People):
    # 私有属性 学生编号
    __stuno = ""

    # 构造方法1
    def __init__(self, age, name, stuno, idcard):
        # 调用父类构造方法
        super().__init__(name, age, idcard)
        self.__stuno = stuno

    # 方法 self代表类的实例，而非类，类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self
    # 方法覆盖：与父类的公共方法一样的名字与参数
    # 覆盖了父类的print_stu_info 方法，子类实例只会调用子类的方法
    def print_stu_info(self):
        print(f'子类方法(print_stu_info) 学生信息：name = {self.name} age={self.age} stuno={self.__stuno} ')


if __name__ == '__main__':
    # 创建对象实例
    stu = Student(22, "tom", "12", "121321313")
    # 直接访问公共属性，无法访问私有属性
    print(f'name = {stu.name} age = {stu.age}')
    # 调用子类方法
    stu.print_stu_info()
    # 调用父类方法
    stu.print_stu_name()
